<?php

namespace JsonLowCode\Form\Fields;

use JsonLowCode\UI\Button;
use JsonLowCode\UI\DynamicInput;
use JsonLowCode\Form\Abstract\FieldAbstract;
use JsonLowCode\Form\Traits\HasDisabled;

/**
 * @property DynamicInput $element
 */
class DynamicInputField extends FieldAbstract
{
    use HasDisabled;

    protected function booting(): void
    {
        $this->element = new DynamicInput();
    }

    /**
     * 最小值
     * @param float|int|string $step
     * @param bool $isJSExpression
     * @return $this
     */
    public function min(float|int|string $step = 1, bool $isJSExpression = false): static
    {
        $this->element->min($step, $isJSExpression);
        return $this;
    }

    /**
     * 最大值
     * @param float|int|string $step
     * @param bool $isJSExpression
     * @return $this
     */
    public function max(float|int|string $step = 1, bool $isJSExpression = false): static
    {
        $this->element->max($step, $isJSExpression);
        return $this;
    }

    /**
     * 动态录入中每项的样式
     * @param string|array $itemStyle
     * @param bool $isJSExpression 是否js表达式
     * @return $this
     */
    public function itemStyle(string|array $itemStyle, bool $isJSExpression = false): static
    {
        $this->element->itemStyle($itemStyle, $isJSExpression);
        return $this;
    }


    /**
     * 每一项的 key 值，会被用于列表渲染中
     * @param string $value
     * @param bool $isJSExpression 是否js表达式
     * @return $this
     */
    public function keyField(string $value, bool $isJSExpression = false): static
    {
        $this->element->keyField($value, $isJSExpression);
        return $this;
    }


    /**
     * 动态录入使用的预设，在不设定 $slots.default 的时候生效
     * @param string $value 'input' | 'pair'
     * @param bool $isJSExpression 是否js表达式
     * @return $this
     */
    public function preset(string $value = 'input' | 'pair', bool $isJSExpression = false): static
    {
        $this->element->preset($value, $isJSExpression);
        return $this;
    }

    /**
     * 是否显示排序按钮
     * @param string|bool $bool
     * @param bool $isJSExpression 是否js表达式
     * @return $this
     */
    public function showSortButton(string|bool $bool = true, bool $isJSExpression = false): static
    {
        $this->element->showSortButton($bool, $isJSExpression);
        return $this;
    }

    /**
     * 点击添加按钮时的回调，如果设定则返回值会被用作新添加的初始值。其中 index 是创建内容将要被放置到的位置对应的数组索引，从 1（第二项）开始计算
     * @param string $value 函数 (index:number) => void
     * @param bool $isJSExpression 是否js表达式
     * @return $this
     */
    public function onCreate(string $value = "(index)=>{ }", bool $isJSExpression = false): static
    {
        $this->element->onCreate($value, $isJSExpression);
        return $this;
    }

    /**
     * 点击第 index 项删除按钮的回调
     * @param string $value 函数 (index:number) => void
     * @param bool $isJSExpression 是否js表达式
     * @return $this
     */
    public function onRemove(string $value = "(index)=>{ }", bool $isJSExpression = false): static
    {
        $this->element->onRemove($value, $isJSExpression);
        return $this;
    }

    /**
     * 新建项按钮的属性
     * @param string|array|Button $value 函数 (index:number) => void
     * @return $this
     */
    public function createButtonProps(string|array|Button $value = []): static
    {
        $this->element->createButtonProps($value);
        return $this;
    }
}
